UE.plugin.register("charts", function () {
    var me = this;

    return {
        bindEvents: {
            chartserror: function () {},
        },
        commands: {
            charts: {
                execCommand: function (cmd, data) {
                    var tableNode = domUtils.findParentByTagName(
                            this.selection.getRange().startContainer,
                            "table",
                            true
                        ),
                        flagText = [],
                        config = {};

                    if (!tableNode) {
                        return false;
                    }

                    if (!validData(tableNode)) {
                        me.fireEvent("chartserror");
                        return false;
                    }

                    config.title = data.title || "";
                    config.subTitle = data.subTitle || "";
                    config.xTitle = data.xTitle || "";
                    config.yTitle = data.yTitle || "";
                    config.suffix = data.suffix || "";
                    config.tip = data.tip || "";
                    //数据对齐方式
                    config.dataFormat = data.tableDataFormat || "";
                    //图表类型
                    config.chartType = data.chartType || 0;

                    for (var key in config) {
                        if (!config.hasOwnProperty(key)) {
                            continue;
                        }

                        flagText.push(key + ":" + config[key]);
                    }

                    tableNode.setAttribute("data-chart", flagText.join(";"));
                    domUtils.addClass(tableNode, "edui-charts-table");
                },
                queryCommandState: function (cmd, name) {
                    var tableNode = domUtils.findParentByTagName(
                        this.selection.getRange().startContainer,
                        "table",
                        true
                    );
                    return tableNode && validData(tableNode) ? 0 : -1;
                },
            },
        },
        inputRule: function (root) {
            utils.each(root.getNodesByTagName("table"), function (tableNode) {
                if (tableNode.getAttr("data-chart") !== undefined) {
                    tableNode.setAttr("style");
                }
            });
        },
        outputRule: function (root) {
            utils.each(root.getNodesByTagName("table"), function (tableNode) {
                if (tableNode.getAttr("data-chart") !== undefined) {
                    tableNode.setAttr("style", "display: none;");
                }
            });
        },
    };

    function validData(table) {
        var firstRows = null,
            cellCount = 0;

        //行数不够
        if (table.rows.length < 2) {
            return false;
        }

        //列数不够
        if (table.rows[0].cells.length < 2) {
            return false;
        }

        //第一行所有cell必须是th
        firstRows = table.rows[0].cells;
        cellCount = firstRows.length;

        for (var i = 0, cell; (cell = firstRows[i]); i++) {
            if (cell.tagName.toLowerCase() !== "th") {
                return false;
            }
        }

        for (var i = 1, row; (row = table.rows[i]); i++) {
            //每行单元格数不匹配， 返回false
            if (row.cells.length != cellCount) {
                return false;
            }

            //第一列不是th也返回false
            if (row.cells[0].tagName.toLowerCase() !== "th") {
                return false;
            }

            for (var j = 1, cell; (cell = row.cells[j]); j++) {
                var value = utils.trim(
                    cell.innerText || cell.textContent || ""
                );

                value = value
                    .replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "")
                    .replace(/^\s+|\s+$/g, "");

                //必须是数字
                if (!/^\d*\.?\d+$/.test(value)) {
                    return false;
                }
            }
        }

        return true;
    }
});
